/*================================================================
*   Copyright (C) 2020 belonging to YangZhengQing. All rights reserved.
*   
*   文件名称：fork_signal.c
*   创 建 者：YangZhengQing
*   创建日期：2020年03月07日
*   描    述：进程间通信之信号
*
*================================================================*/


//#include "fork_signal.h"

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
//定义全局变量
int			child_run = 0;//子进程运行标志默认0
int			parent_run = 0;//父进程运行标志默认0

void sig_child(int signum)
{
	if(SIGUSR1 == signum)
	{
		child_run = 1;//子线程运行标志置1
	}
}

void sig_parent(int signum)
{
	if(SIGUSR2 == signum)
	{
		parent_run = 1;//父进程运行标志置1
	}
}


int main(int argc, char **argv)
{
	pid_t				pid = -1;//定义进程id
	int					statu;

	signal(SIGUSR1,sig_child);//注册信号和指定信号处理程序
	signal(SIGUSR2,sig_parent);

	pid = fork();//创建子进程
	if(pid < 0)
	{
		printf("进程创建失败\n");
		exit(0);
	}
	else if(pid == 0)//子进程
	{
		printf("子进程创建成功,等待父进程发运行信号\n");

		while(!child_run)//子进程在此等信号
		{
		}

		printf("信号到达,子进程开始运行\n");
		
		kill(getppid(),SIGUSR2);//子进程给父进程发运行信号
		
		return 0;//子进程退出

	}
	else
	{
		printf("父进程等待子进程发运行信号\n");

		kill(pid,SIGUSR1);//给子进程发运行信号

		while(!parent_run)//父进程在此等待运行信号
		{
		}

		printf("父进程开始运行\n");

		waitpid(&statu);//父进程等待子进程退出，避免僵死进程
	}

	return 0;
}
